import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Esta clase es acerca de los objetos Duck, los cuales pueden ser beneficiarios o perjudiciales al usuario.
 * 
 * @author Ulises Yamil Castorena Caldera
 * @version 1.0
 */
public class Duck extends Targets
{
    private GreenfootImage[] duckBlueR;//Arreglo que contiene a las imagenes de Duck viendo al lado derecho
    private GreenfootImage[] duckBlueL;//Arreglo que contiene a las imagenes de Duck viendo al lado izquierdo    
    private GreenfootSound duck;//Variable que contiene el sonido del pato
    private int stop;//Variable que es utilizada para determinar un tiempo de espera
    private boolean activate;//Variable que indica el momento en el cual se elimina el duck
    
    /**
     * Constructor de la clase Duck.
     * @param valor Es la dirección en la cual se mueve, cero derecha y uno izquierda.
     */
    public Duck(int valor)
    {        
        stop = 0;        
        direccion = valor;    
        cont = 3;
        activate = false;
        duckBlueR = new GreenfootImage[9];
        duckBlueL = new GreenfootImage[7];    
        duck = new GreenfootSound("duck.mp3");
        for(int a = 0;a < 9 ;a++)
            duckBlueR[a] = new GreenfootImage(a + ".png");       
        for(int a = 0;a < 7 ;a++)
        {
            duckBlueL[a] = new GreenfootImage(a + ".png");
            duckBlueL[a].mirrorHorizontally();
        }                
    }
    
    /**
     * Método Act de la clase.
     */
    public void act() 
    {        
        if(vivo)
        {
            if(nacio)
            {
                duck.play();
                nacio = false;
            }
            duckNivel();
            noSeleccion();
            eliminaDuck();
        }
        else
        {
            if(!activate)            
                caida();
            else
            {
                muerte();
                eliminaDuck();
            }
        }
    }        
    
    /**
     * Controla el movimiento de el pato para todos los niveles.
     */
    public void duckNivel()
    {
        if(direccion == 0)
        {
            if(seleccion)
            {
                setImage(duckBlueR[cont]);            
                cont ++;
            }
            else
            {
                cont --;
                setImage(duckBlueR[cont]);
            }            
            if(cont == 6)            
                seleccion = false;                            
            else if(cont == 3)
                seleccion = true;
            move(4);
        }
        else 
        {
            if(seleccion)
            {
                setImage(duckBlueL[cont]);            
                cont ++;
            }
            else
            {
                cont --;
                setImage(duckBlueL[cont]);
            }            
            if(cont == 6)            
                seleccion = false;                            
            else if(cont == 3)
                seleccion = true;
            move(-4);
        }       
    }
    
    /**
     * Checa si el objeto llegó al borde de pantalla dependiendo de la dirección.
     */
    public void eliminaDuck()
    {
        if(vivo)
        {
            if(direccion == 0)
            {
                if(getX() == getWorld().getWidth() - 1)
                    getWorld().removeObject(this);
            }
            else
            {
                if(getX() == 0)
                     getWorld().removeObject(this);
            }
        }
        else
        {
            if(getY() > 264)
                 getWorld().removeObject(this);
        }
    }
    
    /**
     * Cambia el estatus de vivo a falso.
     */
    public void cambiaVivo()
    {              
        vivo = false;        
        cont = 6;
        seleccion = true;           
    }
    
    /**
     * Muestra la imagen adecuada al momento de dar clic, y lo mantiene hasta que se cumpla la condición.
     */
    public void caida()
    {
        setImage(duckBlueR[8]);
        stop ++;
        if(stop == 30)
            activate = true;
    }
    
    /**
     * Método que selecciona la imagen y cambia la localización del pato, para dar el efecto de caida.
     */
    public void muerte()
    {
        if(seleccion)
        {
            setImage(duckBlueR[cont]);
            cont ++;
            setLocation(getX(),getY() + 4);
        }
        else
        {
            cont --;
            setImage(duckBlueR[cont]);      
            setLocation(getX(),getY() + 4);
        }
        if(cont == 8)
            seleccion = false;
        if(cont == 6)
            seleccion = true;    
    }
    
    /**
     * Manda llamar a un método del mundo y así modifica el score.
     */
    public void modificaScore()
    {
        World mundo = getWorld();        
        if(good == 0)        
            ((DuckWorld)mundo).incrementaScore(-10);
        else
            ((DuckWorld)mundo).incrementaScore(10);
    }
    
    /**
     * Manda llamar a un método del mundo y así modifica el score del enemigo.
     */
    public void modificaScoreEnemy()
    {
        World mundo = getWorld();                   
        ((DuckWorld)mundo).incrementaScoreEnemy(10);
    }
    
    /**
     * Cuando el objeto llega a un cierto punto este método cambia su estado de disponible a false y así poder elegir a otro
     * objeto.
     */
    public void noSeleccion()
    {
        if(direccion == 0) 
        {
            if(getX() > getWorld().getWidth() - 5)
                disponible = false;
        }
        else
        {
            if(getX() < 5)
                disponible = false;
        }
    }
    
    /**
     * disponible()
     * @return True si el objeto está disponible o False sino lo está.
     */
    public boolean disponible()
    {
        return disponible;
    }
}
